﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RiskMan.Config;
using RiskMan.DataClass.Models;
using RiskMan.DataClass.Stops;

namespace RiskMan.Views.Stop
{
    class LogikStops
    {
        private DataClass.Data data;
        private MainWindow mainWindow;

        double TTP_Last;
        string Classcode;
        int accuraccy;

        public LogikStops()
        { }

        public LogikStops(MainWindow mainWindow)
        {
            this.mainWindow = mainWindow;
            data = mainWindow._dataProvider;
        }

        public void Start(StopsModel slmItem)
        {
            //цена последней сделки
            TTP_Last = mainWindow._dataProvider.GetLastPrice(slmItem.Instrument);
            Classcode = mainWindow._dataProvider.GetClasscode(slmItem.Instrument);
            accuraccy = mainWindow._dataProvider.GetAccuraccy(slmItem.Instrument);
            slmItem.CurrentPos = mainWindow._dataProvider.GetCurPosition(slmItem.Instrument, slmItem.Account, slmItem.ClientCode);

            // время работы
            if (new WorkingTimeClass(slmItem.Account).IsWork() == true)
            {

                //Выставление стоп-заявок на закрытие позиций
                if (slmItem.CurrentPos != 0 && (slmItem.TradeList[0].StopLimitCloseStatusOrder == null || (slmItem.TradeList[0].StopLimitCloseStatusOrder == Cfg.Cancel && slmItem.TradeList[0].CloseStatusOrder == Cfg.Cancel)))
                    CloseStopOrder(slmItem);

                if (slmItem.TradeList[0].StopLimitCloseStatusOrder != null)
                {
                    if (Properties.Settings.Default.adapter == Cfg.AdapterQuik)
                        GetStatusAndBalanceStopLimit(slmItem);
                }



                //обнуление активации перестановки в безубыток при нулевой позиции
                //if (slmItem.CurrentPos == 0)
                //    slmItem.BreakevenActive = false;

            }
        }
        
        /// <summary>
        /// Выставление стоп-заявок на закрытие позиции
        /// </summary>
        /// <param name="slmItem"></param>
        private void CloseStopOrder(StopsModel slmItem)
        {
            //находимся в лонге
            double PriceFilled = 0;
            double PriceProfit = 0;
            double StopPrice = GetStopPrice(slmItem, ref PriceFilled, ref PriceProfit);

            if (slmItem.TypeStop == Cfg.StopLimit)
            {
                //if (Properties.Settings.Default.adapter == Cfg.AdapterQuik)
                //    slmItem.TradeList[0].StopLimitCloseID = mainWindow.Terminals.SendLinkedStop(slmItem.Operation == "Купля" ? 'S' : 'B', slmItem.Account, Classcode, slmItem.Instrument, slmItem.ClientCode,
                //        Math.Abs(slmItem.CurPosition), StopPrice, PriceFilled, PriceProfit);

                //if (slmItem.Operation == "Купля")
                //{
                //    slmItem.TradeList[0].StopLimitCloseOperation = Cfg.SELL;
                //    slmItem.TradeList[0].StopLimitClosePrice = StopPrice;
                //}
                //else
                //{
                //    slmItem.TradeList[0].StopLimitCloseOperation = Cfg.BUY;
                //    slmItem.TradeList[0].StopLimitClosePrice = StopPrice;
                //}

                //slmItem.TimeKillStopOrder = DateTime.Now;
                //slmItem.TradeList[0].StopLimitCloseQuantity = slmItem.CurPosition;
                //slmItem.TradeList[0].StopLimitCloseStatusOrder = Cfg.UNKNOWN;
                //slmItem.TradeList[0].StopLimitCloseDate = DateTime.Now;

            }
        }

        /// <summary>
        /// Проверяем нужно ли переносить стоп в безубыток
        /// </summary>
        /// <param name="slmItem"></param>
        /// <returns></returns>
        private void RemoveStopBreakeven(StopsModel slmItem, double price)
        {

            //if (slmItem.Breakeven != 0 && !slmItem.BreakevenActive)
            //{
            //    if (slmItem.CurPosition > 0)
            //        if (TTP_Last >= price + slmItem.Breakeven + slmItem.BreakevenOtstup)
            //            slmItem.BreakevenActive = true;
            //    if (slmItem.CurPosition < 0)
            //        if (TTP_Last <= price - slmItem.Breakeven - slmItem.BreakevenOtstup)
            //            slmItem.BreakevenActive = true;
            //}


        }

        /// <summary>
        /// Рассчитваем цену активации в зависимости от выбарнного типа расчета
        /// </summary>
        /// <param name="slmItem"></param>
        /// <returns></returns>
        private double GetStopPrice(StopsModel slmItem, ref double priceFilled, ref double priceProfit)
        {
            double result = 0;

      
            //result = slmItem.SettingOrderOpenClose.StopLimitOtstup;
            //priceFilled = slmItem.SettingOrderOpenClose.StopLimitSpred;
            //priceProfit = slmItem.SettingOrderOpenClose.Profit;
      

            return result;
        }


        /// <summary>
        /// блок проверки стоп-заявок статуса и баланса
        /// </summary>
        /// <param name="ld"></param>
        public void GetStatusAndBalanceStopLimit(StopsModel ld)
        {
            try
            {
                var orderMassiv = data.GetOrderListAll(ld.Account, ld.ClientCode);
                var StopLimitMassiv = data.GetStopOrderList(ld.Account, ld.ClientCode);


                #region Проверка по цене для стопа часть 1 из 3

                double PriceFilled = 0;
                double PriceProfit = 0;
                double StopPrice = GetStopPrice(ld, ref PriceFilled, ref PriceProfit);

                #endregion



                //Проверка исполнения заявки типа связанная заявка
                //if (ld.SettingOrderOpenClose.TypeStop == Cfg.LINKED_ORDER)
                //    for (int i = 0; i < ld.TradeList.Count; i++)
                //    {
                //        if (ld.TradeList.Count == 0)
                //            break;

                //        #region стоп лимит
                //        foreach (var item2 in StopLimitMassiv)
                //        {
                //            //проверка статусов на изменение заявок на открытие пока балансе не равен выставленному числу
                //            if (item2.TID == ld.TradeList[i].StopLimitCloseID && ld.TradeList[i].StopLimitCloseStatusOrder != Cfg.CANCEL && ld.TradeList[i].StopLimitCloseStatusOrder != Cfg.PERFORMED)
                //            {
                //                ld.TradeList[i].StopLimitCloseNumberOrder = item2.Number;
                //                ld.TradeList[i].StopLimitCloseStatusOrder = item2.Status;
                //            }
                //            if (item2.TID == ld.TradeList[i].StopLimitCloseID)
                //            {
                //                if (ld.TradeList[i].StopLimitCloseStatusOrder != Cfg.UNKNOWN || String.IsNullOrEmpty(ld.TradeList[i].StopLimitCloseResult))
                //                    ld.TradeList[i].StopLimitCloseResult = item2.Result;
                //                //если стоп-заявка отвергнута системой выставляем еще раз
                //                if (ld.TradeList[i].StopLimitCloseResult == Cfg.REMOVE_FORM_TS)
                //                    ld.TradeList[i].StopLimitCloseStatusOrder = null;
                //                //определяем номер заявки выставленной в систему при активации стоп-заявки
                //                if (ld.TradeList[i].StopLimitCloseResult == Cfg.ADD_TO_TS)
                //                    ld.TradeList[i].StopLimitCloseNumberLinkidOrder = item2.NumberOrder;
                //            }

                //            #region Проверка по цене для стопа часть 2 из 3

                //            if (item2.TID == ld.TradeList[i].StopLimitCloseID && ld.TradeList[i].StopLimitCloseStatusOrder == Cfg.ACTIVE)
                //            {
                //                //Проверка по цене активации
                //                if (ld.TimeKillStopOrder.TimeOfDay + new TimeSpan(0, 0, 10) <= DateTime.Now.TimeOfDay)
                //                {
                //                    if (item2.StopPrice != StopPrice)
                //                    {
                //                        mainWindow.Terminals.CancelStopOrder(item2.Number, ld.Instrument, Classcode, ld.Account, ld.ClientCode);
                //                        ld.TimeKillStopOrder = DateTime.Now;
                //                    }
                //                }
                //            }


                //            #endregion

                //        }

                //        //по прошествии 10 или уже другая дата секунд стоп-заявку можно снять снова, если не получилось с первого раза
                //        if ((ld.TimeKillStopOrder.TimeOfDay + new TimeSpan(0, 0, 10) <= DateTime.Now.TimeOfDay || ld.TimeKillStopOrder.Date != DateTime.Now.Date) && ld.TimeKillStopOrder != new DateTime())
                //        {
                //            ld.TimeKillStopOrder = new DateTime();
                //        }

                //        //если в течении 10 секунд стоп-заявка не появилась в системе удалить ее, или ее сняли в ручном формате и не было исполнения, или удаляетс из списка если заявка не определена и уже ее смотрят в другом дне. На закрытие позиции
                //        if ((ld.TradeList[i].StopLimitCloseDate.TimeOfDay + new TimeSpan(0, 0, 10) <= DateTime.Now.TimeOfDay && ld.TradeList[i].StopLimitCloseStatusOrder == Cfg.UNKNOWN)
                //            || (ld.TradeList[i].StopLimitCloseDate.Date != DateTime.Now.Date && (ld.TradeList[i].StopLimitCloseStatusOrder == Cfg.UNKNOWN)))
                //        {
                //            ld.TradeList[i].StopLimitCloseStatusOrder = null;
                //        }
                //        #endregion


                //        //провереям заявки на выставление
                //        if (ld.TradeList[i].StopLimitCloseStatusOrder != null && ld.TradeList[i].StopLimitCloseStatusOrder != Cfg.UNKNOWN)
                //        {
                //            foreach (var item2 in orderMassiv)
                //            {
                //                //проверка статусов на изменение заявок на закрытие позиции
                //                if (ld.TradeList[i].StopLimitCloseID == item2.TID && ld.TradeList[i].CloseStatusOrder == null)
                //                {
                //                    ld.TradeList[i].CloseStatusOrder = item2.Status;
                //                    ld.TradeList[i].CloseNumberOrder = item2.Number;
                //                    ld.TradeList[i].CloseID = item2.TID;
                //                }

                //                if (ld.TradeList[i].CloseStatusOrder != null && ld.TradeList[i].CloseID == item2.TID && ld.TradeList[i].StopLimitCloseNumberLinkidOrder == 0)
                //                    ld.TradeList[i].CloseStatusOrder = item2.Status;

                //                //удаляем трейдлист, если происходит исполнение заявки на профит
                //                if (ld.TradeList[i].CloseStatusOrder == Cfg.PERFORMED)
                //                {
                //                    ld.TradeList.Remove(ld.TradeList[i]);
                //                    if (i > 0)
                //                        i--;
                //                    if (i == 0)
                //                        break;
                //                }

                //                if (ld.TradeList[i].StopLimitCloseResult == Cfg.ADD_TO_TS)
                //                {
                //                    if (ld.TradeList[i].StopLimitCloseNumberLinkidOrder == item2.Number && ld.TradeList[i].OrderFromStopLimitCloseStatusOrder == null)
                //                    {
                //                        ld.TradeList[i].OrderFromStopLimitCloseStatusOrder = item2.Status;
                //                        ld.TradeList[i].OrderFromStopLimitCloseNumberOrder = item2.Number;
                //                        ld.TradeList[i].OrderFromStopLimitCloseID = item2.TID;
                //                    }

                //                    if (ld.TradeList[i].OrderFromStopLimitCloseStatusOrder != null && ld.TradeList[i].OrderFromStopLimitCloseID == item2.TID && ld.TradeList[i].StopLimitCloseNumberLinkidOrder == item2.Number)
                //                        ld.TradeList[i].OrderFromStopLimitCloseStatusOrder = item2.Status;

                //                    //если заявка снята (возможно ручками) исполнена в полном объеме
                //                    if (ld.TradeList[i].OrderFromStopLimitCloseStatusOrder == Cfg.PERFORMED)
                //                    {
                //                        ld.TradeList.Remove(ld.TradeList[i]);
                //                        if (i > 0)
                //                            i--;
                //                        if (i == 0)
                //                            break;
                //                    }
                //                    //если заявка снята (возможно ручками) или во время клиринга
                //                    if (ld.TradeList[i].OrderFromStopLimitCloseStatusOrder == Cfg.CANCEL)
                //                    {
                //                        ld.TradeList[i].StopLimitCloseStatusOrder = null;
                //                        ld.TradeList[i].CloseStatusOrder = null;
                //                        ld.TradeList[i].OrderFromStopLimitCloseStatusOrder = null;
                //                    }
                //                }
                //            }
                //        }

                 //   }
            }
            catch
            { }
        }

    }
}
